// 普通阶乘
function factorial(n) {
  if (n == 1) return n;
  return n * factorial(n - 1)
}
// 尾递归阶乘
function factorial_tail(n, ret = 1) {
  if (n == 1) return ret;
  return factorial_tail(n - 1, n*ret)
}

// 普通递归
function fibonacci (n) {
  if (n <= 2) {
      return 1
  } else {
      return fibonacci(n-1) + fibonacci(n-2)
  }
}
// 尾递归
function fibonacci_tail (n) {
  function f (n , res1, res2) {
      if (n <= 2) {
          return res2
      }
      else {
          return f(n-1, res2, res1 + res2)
      }
  }    
  return f(n, 1, 1)
}